package cn.iocoder.boot.mqtt;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MqttController {

    @Autowired
    private MqttPublisher mqttPublisher;

    @Autowired
    private MqttDynamicSubscriptionService subscriptionService;


    // 发送消息到默认主题
    @GetMapping("/send")
    public String sendMessage(@RequestParam String message) {
        mqttPublisher.sendMessage(message);
        return "消息已发送: " + message;
    }

    // 发送消息到指定主题
    @GetMapping("/sendToTopic")
    public String sendToTopic(@RequestParam String topic, @RequestParam String message) {
        mqttPublisher.sendMessage(topic, message);
        return "消息已发送到主题 " + topic + ": " + message;
    }


    /**
     * 订阅特定主题的处理方法
     *
     * 该方法通过GET请求接收一个主题参数，并调用订阅服务中的订阅方法来订阅该主题
     *
     * @param topic 主题名称，通过URL路径传递
     * @return 返回订阅成功的确认消息，包含订阅的主题名称
     */
    @GetMapping("/subscribe/{topic}")
    public String subscribe(@PathVariable String topic) {
        subscriptionService.subscribeToTopic(topic);
        return "Subscribed to topic: " + topic;
    }

    /**
     * 处理主题取消订阅请求的控制器方法
     * 使用HTTP GET方法访问/unsubscribe/{topic}路径时调用此方法
     *
     * @param topic 要取消订阅的主题名称，作为URL的一部分提供
     * @return 返回一个字符串，表示已成功取消订阅指定的主题
     */
    @GetMapping("/unsubscribe/{topic}")
    public String unsubscribe(@PathVariable String topic) {
        // 调用服务层方法，执行实际的主题取消订阅逻辑
        subscriptionService.unsubscribeFromTopic(topic);
        // 返回取消订阅成功的响应消息，包含取消订阅的主题名称
        return "Unsubscribed from topic: " + topic;
    }
}